package com.kag.common;


import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Description: 检验工具类
 * @Author: 陈子康
 * @Date: 2020/5/7
 */
public class CheckUtil {

    /**
     * @Description: 校验银行卡卡号是否合法
     * @param bankCard
     * @return 合法返回true，不合法返回false
     * 校验过程：
     * 1、从卡号最后一位数字开始，逆向将奇数位(1、3、5等等)相加。
     * 2、从卡号最后一位数字开始，逆向将偶数位数字，先乘以2（如果乘积为两位数，将个位十位数字相加，即将其减去9），再求和。
     * 3、将奇数位总和加上偶数位总和，结果应该可以被10整除。
     */
    public static boolean isBankCardLegal(String bankCard) {
        if (bankCard.length() < 15 || bankCard.length() > 19) {
            return false;
        }
        char bit = getBankCardCheckCode(bankCard.substring(0, bankCard.length() - 1));
        if (bit == 'N') {
            return false;
        }
        return bankCard.charAt(bankCard.length() - 1) == bit;
    }

    /**
     * @Description: 从不含校验位的银行卡卡号采用 L U H M 校验算法获得校验位
     * @param nonCheckCodeBankCard
     * @return
     */
    public static char getBankCardCheckCode(String nonCheckCodeBankCard) {
        if (nonCheckCodeBankCard == null || nonCheckCodeBankCard.trim().length() == 0
                || !nonCheckCodeBankCard.matches("\\d+")) {
            //如果传的不是数据返回N
            return 'N';
        }
        char[] chs = nonCheckCodeBankCard.trim().toCharArray();
        int luhmSum = 0;
        for (int i = chs.length - 1, j = 0; i >= 0; i--, j++) {
            int k = chs[i] - '0';
            if (j % 2 == 0) {
                k *= 2;
                k = k / 10 + k % 10;
            }
            luhmSum += k;
        }
        return (luhmSum % 10 == 0) ? '0' : (char) ((10 - luhmSum % 10) + '0');
    }

    /**
     * @Description: 验证手机号码是否合法
     * @param telephone 需要验证的打手机号码
     * @return 合法返回true，不合法返回false
     * */
    public static boolean isPhoneNumberLegal(String telephone) {
        if (telephone == null || telephone.length() != 11) {
            return false;
        }
        //大陆手机号码验证正则表达式
        Pattern pattern = Pattern.compile("^1[3,5]\\d{9}||18[6,8,9]\\d{8}$");
        Matcher matcher = pattern.matcher(telephone);
        if (matcher.matches()) {
            return true;
        }
        return false;
    }

    /**
     * @Dscription: 验证名字姓氏是否合法
     * @param name
     * @return 合法返回true，不合法返回false
     */
    public static boolean isFirstNameLegal(String name){
        String[] surName = {
                "赵","钱","孙","李","周","吴","郑","王","冯","陈",
                "楮","卫","蒋","沈","韩","杨","朱","秦","尤","许",
                "何","吕","施","张","孔","曹","严","华","金","魏",
                "陶","姜","戚","谢","邹","喻","柏","水","窦","章",
                "云","苏","潘","葛","奚","范","彭","郎","鲁","韦",
                "昌","马","苗","凤","花","方","俞","任","袁","柳",
                "酆","鲍","史","唐","费","廉","岑","薛","雷","贺",
                "倪","汤","滕","殷","罗","毕","郝","邬","安","常",
                "乐","于","时","傅","皮","卞","齐","康","伍","余",
                "元","卜","顾","孟","平","黄","和","穆","萧","尹",
                "姚","邵","湛","汪","祁","毛","禹","狄","米","贝",
                "明","臧","计","伏","成","戴","谈","宋","茅","庞",
                "熊","纪","舒","屈","项","祝","董","梁","杜","阮",
                "蓝","闽","席","季","麻","强","贾","路","娄","危",
                "江","童","颜","郭","梅","盛","林","刁","锺","徐",
                "丘","骆","高","夏","蔡","田","樊","胡","凌","霍",
                "虞","万","支","柯","昝","管","卢","莫","经","房",
                "裘","缪","干","解","应","宗","丁","宣","贲","邓",
                "郁","单","杭","洪","包","诸","左","石","崔","吉",
                "钮","龚","程","嵇","邢","滑","裴","陆","荣","翁",
                "荀","羊","於","惠","甄","麹","家","封","芮","羿",
                "储","靳","汲","邴","糜","松","井","段","富","巫",
                "乌","焦","巴","弓","牧","隗","山","谷","车","侯",
                "宓","蓬","全","郗","班","仰","秋","仲","伊","宫",
                "宁","仇","栾","暴","甘","斜","厉","戎","祖","武",
                "符","刘","景","詹","束","龙","叶","幸","司","韶",
                "郜","黎","蓟","薄","印","宿","白","怀","蒲","邰",
                "从","鄂","索","咸","籍","赖","卓","蔺","屠","蒙",
                "池","乔","阴","郁","胥","能","苍","双","闻","莘",
                "党","翟","谭","贡","劳","逄","姬","申","扶","堵",
                "冉","宰","郦","雍","郤","璩","桑","桂","濮","牛",
                "寿","通","边","扈","燕","冀","郏","浦","尚","农",
                "温","别","庄","晏","柴","瞿","阎","充","慕","连",
                "茹","习","宦","艾","鱼","容","向","古","易","慎",
                "戈","廖","庾","终","暨","居","衡","步","都","耿",
                "满","弘","匡","国","文","寇","广","禄","阙","东",
                "欧","殳","沃","利","蔚","越","夔","隆","师","巩",
                "厍","聂","晁","勾","敖","融","冷","訾","辛","阚",
                "那","简","饶","空","曾","毋","沙","乜","养","鞠",
                "须","丰","巢","关","蒯","相","查","后","荆","红",
                "游","竺","权","逑","盖","益","桓","公","仉","督",
                "晋","楚","阎","法","汝","鄢","涂","钦","归","海",
                "岳","帅","缑","亢","况","后","有","琴","商","牟",
                "佘","佴","伯","赏","墨","哈","谯","笪","年","爱",
                "阳","佟",
                "万俟","司马","上官","欧阳","夏侯",
                "诸葛","闻人","东方","赫连","皇甫",
                "尉迟","公羊","澹台","公冶","宗政",
                "濮阳","淳于","单于","太叔","申屠",
                "公孙","仲孙","轩辕","令狐","锺离",
                "宇文","长孙","慕容","鲜于","闾丘",
                "司徒","司空","丌官","司寇","南宫",
                "子车","颛孙","端木","巫马","公西",
                "漆雕","乐正","壤驷","公良","拓拔",
                "夹谷","宰父","谷梁","段干","百里",
                "东郭","南门","呼延","羊舌","微生",
                "梁丘","左丘","东门","西门"
        };
        String firstName = name.substring(0, 1);
        for(String s : surName){
            String s1 = s.substring(0,1);
            if(s.contains(firstName)){
                return true;
            }
        }
        return false;
    }
}